package com.lost.octopus.es.helper.annotation;


import com.lost.octopus.es.helper.constant.EsMatchMode;
import com.lost.octopus.es.helper.constant.EsMatchType;
import com.lost.octopus.es.helper.constant.EsSearchMode;
import com.lost.octopus.es.helper.entity.wrapper.EsQueryWrapper;
import com.lost.octopus.es.helper.entity.wrapper.QueryWrapper;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * es查询字段注解.支持自定义扩展 EsBoolQueryWrapper 和其他定制化属性 {@link EsSearch#otherParam()}
 * @author zhangbh
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface EsSearch {

    /**
     * 实际查询使用的字段名称。默认使用注解的字段名
     * 特殊：
     * 当有属性 address（默认text），有子属性 arr1 是keyword，想查询此属性时，则： address.arr1
     * @return 指定字段名
     */
    String name() default "";

    /**
     * 默认为 must ，对应sql中 and、or层级
     * @return 查询类型
     */
    Class<? extends QueryWrapper> queryType() default EsQueryWrapper.class;

    /**
     * 查询时，字段的匹配方式,同 sql中 =、like层级
     * 默认全等查询
     * @return {@see EsFieldMatchType}
     */
    EsMatchType matchType() default EsMatchType.term;

    /**
     * 对应{@link #matchType()}的模式
     * @return 匹配模式
     */
    EsMatchMode matchMode() default EsMatchMode.none;

    /**
     * 自定义参数 扩展EsBoolQueryWrapper时可使用
     * @return 自定义参数
     */
    String otherParam() default "";


    /**
     * boolean查询模式，must、must_not、should 默认由wrapper内定义的默认值
     * @return 查询模式
     */
    EsSearchMode searchMode() default EsSearchMode.WRAPPER_DEFAULT;
}
